Ansible 部署与常用模块示例

自动化运维工具, 较轻量, 可根据服务器架构, 进行服务的编排和部署.

特性

基于 ssh 服务, 无需在目标机器安装 client 软件, 也不需要有服务端存在
依靠大量的模块实现批量部署
配置文件 /etc/ansible/ansible.cfg

参考文档

安装

机器分为 管理机被管理机.

云主机创建的时候, 就要保证管理机可以通过 ssh 免密登录被管理机.

管理机安装 Ansible

1
2
3
4
sudo yum install ansible -y

sudo pip install --upgrade pip
sudo pip install request

管理机配置被管理机组

vim /etc/ansible/hosts

增加机器组

1
2
3
4
[consulservers]
192.168.254.7
192.168.254.8
192.168.254.9

被管理机安装 Ansible 支持

yum install libselinux-python -y

PS: 在开启 selinux 情况下必须安装, 关闭 selinux 情况下无需安装.

使用 Ansible 管理服务器

模块的文档

http://docs.ansible.com/ansible/latest/modules_by_category.html

这里面有支持的全部模块, 可以按分类查找.

可以使用 ansible-doc 查询文档

  • -l 列出所有可用的模块信息
  • -j 输出所有插件 json 信息
  • -s NAME 查看指定模块的参数信息

输出信息含义

  • 绿色: 查询, 无异常
  • 红色: 操作异常
  • 黄色: 对主机作出了改动
  • 粉色: 对操作的建议和忠告

常用模块简析

ansible 被管理机组 -k “123456” -m command -a “uptime”

-k :以交互方式输入密码, 进行远程管理

-m #指定模块参数(command 为默认模块, 不写也可以)

command #模块名称

-a #指定利用模块执行的动作参数, -a 后面的是要执行的命令

uptime #批量执行的命令

Ansible 命令

1
ansible 服务器组 参数..
  • -a MODULE_ARGS, –args=MODULE_ARGS 模块的参数
  • –ask-vault-pass
  • -B SECONDS, –background=SECONDS 异步超时时间(default=N/A)
  • -C, –check 预演修改, 不实际进行处理
  • -D, –diff 修改(小)文件时展示差异, 可以与 –check 一起用
  • -e EXTRA_VARS, –extra-vars=EXTRA_VARS
  • -f FORKS, –forks=FORKS 并行任务数(default=5)
  • -h, –help 输出帮助
  • -i INVENTORY, –inventory=INVENTORY
  • -l SUBSET, –limit=SUBSET
  • –list-hosts 输出服务器组中的服务器列表
  • -m MODULE_NAME, –module-name=MODULE_NAME 默认命令执行模块(default=command)
  • -M MODULE_PATH, –module-path=MODULE_PATH 模块路径
  • -o, –one-line 压缩日志
  • –playbook-dir=BASEDIR
  • -P POLL_INTERVAL, –poll=POLL_INTERVAL 使用 -B 参数时, 修改轮训时间(default=15)
  • –syntax-check 测试配置文件格式
  • -t TREE, –tree=TREE 日志文件夹
  • –vault-id=VAULT_IDS
  • –vault-password-file=VAULT_PASSWORD_FILES 密码文件位置
  • -v, –verbose 打印详细日志, 支持 -v -vvv -vvvv
  • –version 版本, 配置文件位置, 模块加载位置, ansible 安装路径

权限参数

  • -b, –become 执行提权切换账号
  • –become-method=BECOME_METHOD 指定提权命令(default=sudo), ansible-doc -t become -l 查看所有命令.
  • –become-user=BECOME_USER 指定提权用户(default=root)
  • -K, –ask-become-pass 指定提权用户密码

服务器连接参数

  • -k, –ask-pass 使用密码, 非 ssh 免密交互

  • –private-key=PRIVATE_KEY_FILE, –key-file=PRIVATE_KEY_FILE 使用指定的 private key, 非 id_rsa

  • -u REMOTE_USER, –user=REMOTE_USER 指定远程服务器用户名(default=None)

  • -c CONNECTION, –connection=CONNECTION 使用的链接方式(default=smart)

  • -T TIMEOUT, –timeout=TIMEOUT 执行时间(default=10)

  • –ssh-common-args=SSH_COMMON_ARGS 给 sftp/scp/ssh 命令传递额外参数

  • –sftp-extra-args=SFTP_EXTRA_ARGS

  • –scp-extra-args=SCP_EXTRA_ARGS

  • –ssh-extra-args=SSH_EXTRA_ARGS

基础模块解析

command(默认模块)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#批量显示远程主机的网卡信息
ansible george -m command -a "ifconfig"

#批量切换到远程主机的/tmp 目录下, 创建 kai.txt 这个文件
ansible george -m commadn -a "chair=/tmp touch kai.txt"

#批量判断远程主机/tmp 下有没有 kai 这个文件, 如果有就 skip, 没有就执行后面的命令
ansible george -m command -a "creates=/tmp/kai touch /tmp/kai"

#批量判断远程主机/tmp 下有没有 kai 这个文件, 如果有就执行后面的命令, 没有就 skip
ansible george -m command -a "removes=/tmp/kai.txt touch /tmp/123.txt"

#free_from(默认参数)可以输入任何系统命令信息, 但是不包含一些特殊环境变量和特殊符号信息,如:<>,|;&
ansible george -m command -a "ls -l"

ping

1
2
#返回 pong, 说明可以登录 SSH 连接, 这里 ping 但不是测试网络连通性的,用于验证能否登录 SSH 连接, 在查看是否满足 python 的支持, 属于 system 模块
ansible george -m ping

调试模块 debug

1
2
#此模块在执行过程中打印语句, 对于调试变量或表达式非常有用, 而不一定会停止播放, 与 "When" 指令一起调试非常有用
ansible george -m debug

文件传输 copy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 1)copy 参数 src

# 拷贝文件, 存在覆盖目标, 目标目录不存在创建
ansible george -m copy -a "src=/etc/hosts dest=/tmp/"
ansible george -m copy -a "src=/etc/hosts dest=/tmp/dir/"

# 拷贝文件, 如果上级目录不存在, 则不会创建多级目录, 传输就无法成功
ansible george -m copy -a "src=/etc/hosts dest=/tmp/1/2/3/4/"

# 拷贝目录, 如果远程主机目录不存在, 传输时可以创建多层目录
ansible george -m copy -a "src=/tmp dest=/tmp/1/2/3/4"

# 传输目录不以 / 结尾, 传输目录下内容目标以 / 结尾
ansible george -m copy -a "src=/tmp dest=/tmp/1/2/3/4"
ansible george -m copy -a "src=/tmp dest=/tmp/1/2/3/4/"

# remote_src 设置为true时(默认为flase), 做远程主机上本地文件的拷贝操作, 不支持递归复制
ansible george -m copy -a "remote_src=true src=/etc/hosts dest=/tmp/1/2/"

# 2)copy 参数 backup=yes

# 分发文件时, 如果与远程主机下 hosts 文件内容不一致, 那么会备份源文件为"hosts.5714...以时间戳命名 ", 在修改 hosts 源文件的内容, 不输入默认backup=no, 就是不备份, 会覆盖源文件
ansible george -m copy -a "src=/etc/hosts dest=/etc/ backup=yes"

# 3)copy 参数 mode、owner、group

# 改变文件的权限为 0600, 所有者和属组为 george
ansible george -m copy -a "src=/etc/hosts dest=/tmp/ mode=0600 owner=george group=george"

# 4)copy 参数 force

# 默认为 forec=yes, 如果和远程主机信息不一致, 会覆盖, 如果 force=no, 那么远程主机同名文件不会做改变
ansible george -m copy -a "src=/etc/hosts dest=/tmp/ force=yes"

# 5)copy 参数 content

# 写入信息到/tmp/ hosts 中会把源内容覆盖掉, 谨慎操作, 只能添加少量的信息, 添加多量的, 可以用 template 模块
ansible george -m copy -a "content=123123 dest=/tmp/hosts"

远程执行命令 shell

1
2
3
4
5
6
7
8
# 支持特殊符号, -a 里面可接多个名, 用分号分割.
ansible george -m shell -a "hostname; hostname -i"

# 用 shell 执行一个脚本很麻烦的, 用 script 执行
# 1)推送脚本过去, 并授权
ansible george -m copy -a "src=/tmp/demo.sh dest=/tmp mode=+x"
# 2)运行脚本
ansible george -m shell -a "/tmp/demo.sh"

远程执行脚本 script

1
2
# 将本地脚本中的信息, 在远程主机上执行
ansible george -m script -a "/server/scritps/keepalived.sh"

获取主机信息 setup

1
2
3
4
5
# 显示远程主机的所有信息(后面加-v 显示详细信息),提取 IP、或架构信息等, X86 来判断主机架构, 安装合适软件
ansible george -m setup

# 主要用于解决一些错误:如远程主机 hang 住了, ansible 会输出少量信息(最多-vvvv)
ansible georhe -m setup -v

软件包管理 yum

1
2
# 批量使用yum安装软件iotop
ansible george -m yum -a "name=iotop state=installed"

系统服务启动关闭 service

1
2
#临时停止crond服务, 取消开机自启动(相反:state=started enable=yes)
ansible george -m service -a "name=crond state=stopped enable=no"

文件(夹)操作 file

修改文件或目录属性信息, 用于创建文件或目录, 也可以用 mode、owner、group 定义文件或目录的权限信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1) path 参数

# 指定路径,是dest,name的别名, 作用一样
ansible george -m file "path=/tmp/ state=directory mode=0644"

2)state 参数

# 创建目录为dir_01
ansible george -m file -a "dest=/opt/dir_01/ state=directory"

# 创建文件为file_01
ansible george -m file -a "dest=/opt/file_01 state=touch"

# 删除文件file_01
ansible george -m file -a "dest=/opt/file_01 state=absent"

# 创建符号链接, 基于本机有源文件
ansible george -m file -a "src=/opt/hosts dest=/opt/hosts_link state=link"

定时任务模块 cron

只能管理自己创建的定时任务, 本来有的管理不了

* * * * * /bin/sh /server/scripts/test.sh &>/dev/null

  • minute # Minute when the job should run ( 0-59, _, _/2, etc )
  • hour # Hour when the job should run ( 0-23, _, _/2, etc )
  • day # Day of the month the job should run ( 1-31, _, _/2, etc )
  • month # Month of the year the job should run ( 1-12, _, _/2, etc )
  • weekday # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )
  • job # 定义定时任务与要做什么事
  • name # 给定时任务加一个备注, 避免创建出多个重复的定时任务(根据定时任务备份判断是否生成一个新的定时任务)
  • stat # 若设置为 present, 表示创建定时任务, 若设置为 absent, 表示删除指定定时任务
  • disabled # disable=yes 注释掉定时任务(不生效), disable=no 解除注释定时任务(生效)
1
2
3
4
5
6
7
8
# 创建定时任务
ansible george -m cron -a "name='backup servcie' minute=*/5 job='/usr/sbin/ntpdate time.nist.gov > /dev/null 2>&1'"

# 删除定时任务
ansible george -m cron -a "name=`backup service` state=absent"

# 注释掉定时任务, 反之取消注释
ansible george -m cron -a "name='backup servcie' minute=*/5 job='/usr/sbin/ntpdate time.nist.gov > /dev/null 2>&1' disabled=yes"

磁盘挂载 mount

  • src # 要被挂载的目录或文件
  • path # 指定挂载点的路径
  • fstype # 指定挂载时的文件系统类型
  • opts # 在挂载时, 指定挂载参数信息
  • state # state=mounted, 在 fstab 文件中的备份将被激活挂载或适当配置, 如果指定 mounted 的挂载挂载点不存在, 会创建 # state=unmounted, 设备将被卸载不会改变 fstab 文件中的信息 # state=absent 和 state=present, 只处理 fatab, 但不影响目录的挂载
1
ansible george -m mount -a "state=mounted src=172.16.1.31:/data path=/data fstype=nfs"
Donate - Support to make this site better.
捐助 - 支持我让我做得更好.